﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WServer.Service
{
    public class StatusCode
    {
        /// <summary>
        /// 命令成功执行       
        /// </summary>
        public const byte SUCCESS = 1;


        /// <summary>
        /// 命令执行失败
        /// </summary>
        public const byte FAIL = 0;


    }
    public class ErrorCode
    {
        public const byte NODTU = 1;  //dtu不存在，从未连接过服务器，或手动添加

        public const byte DTUOFFLINE = 2;  //dtu离线


        public const byte DTUUSED = 3;    //dtu被占用

        public const byte DTUDISABLE = 4;//dtu被禁用，但是不影响dtu上线

        public const byte NOACCESSDTU = 5;//无权访问此DTU


        public const byte NOUSER = 6;//账户不存在

        public const byte PASSWORDERROR = 7;//密码错误

        public const byte DTUTIMEOUT = 8;//dtu超时

        public const byte NOTLOGIN = 9;//未登录

        public const byte NOTREG = 10;//未注册

    }
    //从WServer 1.7的协议版本号为1 
    public   class MessageType
    {

        /// <summary>
        /// 透明传输。WServer不做任何处理，也不返回任何消息只是简单的转发,DCC的透传数据
        /// 发送给WServer时用此类型，WServer返回时也使用此类型，WServer返回时的第一个字节是
        /// 状态码（SUCCESS 或 FAIL），表示该消息成功或失败, DATA = 1
        /// </summary>
        public static readonly   byte DATA = 1;

        //心跳包
        public static readonly byte DTUHEARTBEAT = 2;



        //调试数据
        public static readonly byte DEBUG_DATA = 3;


        /// <summary>
        /// DCC用户登录，消息体是逗号分隔的用户名,密码,[IMEI]
        /// 若IMEI不为空则在登录的同时执行注册，若只有登录信息则只进行登录
        /// 1.只登录
        /// 成功返回SUCCESS,失败返回Fail，Fail的具体错误码，见ErrorCode，
        /// 
        /// 2.登录并注册
        /// 如果登录和注册都成功，那么只返回注册成功的消息
        /// 如果登录失败，返回登录失败的消息
        /// 如果登录成功，注册失败返回注册失败的消息
        /// </summary>
        public static readonly byte DCCLOGIN = 4;

        //DCC用户注册
        public static readonly byte DCCREG = 5;

        //DTU登录，与DCC登录类似
        public static readonly byte DTULOGIN = 6;

        //DTU注册
        public static readonly byte DTUREG = 11;//与旧版本兼容

        //DTU注册响应
        public const byte DTUREGREP = 12;//与旧版本兼容






        //灌溉任务指令
        public static readonly byte IRRI_TASK = 23;  //透传

        //灌溉任务报告;
        public static readonly byte IRRI_TASK_REPORT = 24;//处理

   
        /// <summary>
        /// 灌溉任务指令响应 25
        /// </summary>
        public static readonly byte IRRI_TASK_REP = 25;//透传

        //DTU异常复位指令
        public static readonly byte DTU_RESET = 26;//透传

        //异常复位响应
        public static readonly byte DTU_RESET_REP = 27; //透传

        //DTU参数配置
        public static readonly byte DTU_CONFIG = 28;  //透传

        //DTU参数配置响应
        public static readonly byte DTU_CONFIG_REP = 29; //透传

        //30	转发1，源DTU->WServer
        public static readonly byte SRCDTU_SERVER = 30;//处理
                                             //31	转发2，WServer->目标DTU
        public static readonly byte SERVER_DSTDTU = 31;//处理
                                             //32	转发3，目标DTU->WServer
        public static readonly byte DSTDTU_SERVER = 32;//处理
                                             //33	转发4，WServer->源DTU
        public static readonly byte SERVER_SRCDTU = 43;//处理

        ///////////////////////////
        //来自HTTP的数据包
        public static readonly byte DATA_HTTP = 33;


        //34	异常上报
        public static readonly byte ERROR_REPORT = 34;//处理

        //35	异常上报响应
        public static readonly byte ERROR_REPORT_REP = 35;//处理

        //36	读取所有参数
        public static readonly byte GET_CONFIG = 36;//透传

        //37	读取参数响应（响应格式与配置格式相同）
        public static readonly byte GET_CONFIG_REP = 37;//透传

        //38	特权指令        
        public static readonly byte PRIV_INSTR = 38;//透传

        //39	特权指令响应
        public static readonly byte PRIV_INSTR_REP = 39;//透传

        //40	特权取消指令
        public static readonly byte PRIV_INSTR_CANCEL = 40;//透传

        //41	特权取消指令响应
        public static readonly byte PRIV_INSTR_CANCEL_REP = 41;//透传

        //42	CRC校验错误
        public static readonly byte ERROR_CRR = 42;

         


       

        //灌溉控制器
        static Dictionary<byte, string> _MessageKey = null;

        static MessageType()
        {
            var fields= typeof(MessageType).GetFields();
            _MessageKey = new Dictionary<byte, string>();
            foreach (var f in fields)
            {
                object v = f.GetValue(null);
                var k = Convert.ToByte(v);
                _MessageKey.Add(k, f.Name);
            } 

             
        }

        public static string GetKeyName(byte k)
        {
            return _MessageKey[k];
        }

        public static bool ContainsKey(byte k)
        {
            return _MessageKey.ContainsKey(k);
        }

    }
}
